<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    // all方法

    // 应用场景：某个请求需要的数据要在多个请求都完成的情况下再执行

    // all方法的参数为可迭代数据类型(具有iterator接口)，其中每个成员都是Promise实例

    // 只有所有Promise实例的状态都为resolved或者其中一个为rejected
    // 才会调用后面的then方法
    // 实现all方法
    Promise.all1 = function (promiseArr) {
      return new Promise(function (resolve, reject) {
        // 获取参数数组长度，以及准备对应的数组
        let len = promiseArr.length
        let count = 0,  // 记数
          results = new Array(len);
        // 遍历参数
        for (let i = 0; i < len; i++) {
          // 包装参数为promise对象,调用每个promise对象的then方法
          Promise.resolve(promiseArr[i]).then((val) => {
            // 成功的回调
            count++; // 记成功的参数个数
            results[i] = val; // 记录获取的值
            if (count === len) { // 所有都获取到后
              resolve(results) // 返回 值数组
            }
          }, (res) => {
            reject(res)
          })
        }
      })
    }

    Promise.all1([
      new Promise((resolve, reject) => {
        setTimeout(function () {
          let data = '数据1';
          resolve(data);
          // 某个promise实例状态为reject则马上调用then方法
          // reject('err')
        }, 1000);
      }),
      new Promise((resolve, reject) => {
        setTimeout(function () {
          let data = '数据2';
          resolve(data);
        }, 3000);
      })
    ]).then(results => {
      console.log(results);
    }).catch(err => {
      console.log(err);
    })


  </script>
</body>

</html>